001    package videoautomat;
002    import java.awt.Rectangle;
003    import java.io.FileOutputStream;
004    import java.io.IOException;
005    import java.util.Iterator;
006    
007    import log.Log;
008    import sale.Action;
009    import sale.CalendarTime;
010    import sale.MenuSheet;
011    import sale.MenuSheetItem;
012    import sale.SaleProcess;
013    import sale.SalesPoint;
014    import sale.Shop;
015    import sale.StepTimer;
016    import users.UserManager;
017    import data.QuoteValue;
018    import data.Value;
019    import data.events.VetoException;
020    import data.ooimpl.CatalogImpl;
021    import data.ooimpl.CountingStockImpl;
022    import data.ooimpl.EUROCurrencyImpl;
023    import data.ooimpl.MoneyBagImpl;
024    
025    /**
026     * This is the central class for this application - the <code>Shop</code>. It contains the
027     * video-catalog and stock of this video-shop, the shop`s money and therefor a currency-catalog
028     * containing which coins this automat accepts and a <code>Timer</code> for simulation purposes.
029     *  
030     */
031    public class VideoShop extends Shop {
032            /**
033             * Key of the video -<code>Catalog</code>
034             */
035            public static final String C_VIDEOS = "VideoCatalog";
036            /**
037             * Key of the currency -<code>Catalog</code>
038             */
039            public static final String C_CURRENCY = "CurrencyCatalog";
040            /**
041             * Key of the video -<code>CountingStock</code>
042             */
043            public static final String CC_VIDEOS = "VideoStock";
044            /**
045             * Key of the <code>MoneyBag</code>
046             */
047            public static final String MB_MONEY = "Money";
048            /**
049             * The name of the global log file
050             */
051            public static final String FILENAME = "automat.log";
052    
053        /** The Caption of the <code>VideoAutomat</code> */
054        public static final String CAPTION_AUTOMAT = "****** VIDEOAUTOMAT *** 24 H ******";    
055        
056        /** Label for the menusheet that contains self-defined items */
057        public static final String MS_NEW = "Videoautomat";
058    
059        /** Label for the button to start the automat */
060        public static final String MSI_AUTOMAT = "Start automat";
061        
062        /**
063         * Label for the admin- <code>ActionCapability</code>, if it`s not granted.
064         */
065        public static final String MSG_ACCESS = "Acces denied!!!";     
066        /**
067         * Label for the time setter button
068         */
069        public static final String MSI_DAY = "+ 1 Day";
070            /**
071             * Constructs a new VideoShop and set it as <code>Shop#setTheShop()</code>. Also initialize
072             * the global <code>Catalogs</code> and <code>Stocks</code> and sets a <code>Timer</code>.
073             *  
074             */
075            public VideoShop() {
076                    super();
077                    setShopFrameBounds(new Rectangle(0, 0, 640, 480));
078    
079                    addCatalog(new CatalogImpl(C_VIDEOS));
080                    addCatalog(new EUROCurrencyImpl(C_CURRENCY));
081                    addStock(
082                            new CountingStockImpl(
083                                    CC_VIDEOS,
084                                    (CatalogImpl) getCatalog(C_VIDEOS)));
085                    
086                    UserManager.setGlobalUM(new UserManager());
087                    
088                    addStock(
089                            new MoneyBagImpl(
090                                    MB_MONEY,
091                                    (EUROCurrencyImpl) getCatalog(C_CURRENCY)));
092                    
093                    setTimer(new StepTimer(new CalendarTime(System.currentTimeMillis())));
094                    setShopFrameTitle(getTimer().getTime().toString());
095                    try {
096                            Log.setGlobalOutputStream(new FileOutputStream(FILENAME, true));
097                    } catch (IOException ioex) {
098                            System.err.println("Unable to create log file.");
099                    }
100            }
101    
102            /**
103             * @return the <code>Shop`s MenuSheet</code>, containing the default one, a button to start
104             *              an automat and a button to switch the time further.
105             * @see sale.Shop#createShopMenuSheet()
106             */
107            protected MenuSheet createShopMenuSheet() {
108                    MenuSheet ms_default = super.createShopMenuSheet();
109                    MenuSheet ms_new = new MenuSheet(MS_NEW);
110                    MenuSheetItem msi_automat =
111                            new MenuSheetItem(MSI_AUTOMAT, new Action() {
112                            public void doAction(SaleProcess p, SalesPoint sp)
113                                    throws Throwable {
114                                    addSalesPoint(new VideoAutomat());
115                            }
116                    });
117                    ms_new.add(msi_automat);
118                    MenuSheetItem msi_time =
119                            new MenuSheetItem(MSI_DAY, new Action() {
120                            public void doAction(SaleProcess p, SalesPoint sp)
121                                    throws Throwable {
122                                    getTimer().goAhead();
123                                    setShopFrameTitle(getTimer().getTime().toString());
124                            }
125                    });
126                    ms_new.add(msi_time);
127                    ms_default.add(ms_new);
128                    return ms_default;
129            }
130            /**
131             * Overidden to avoid the annoying save-query, when quiting the application.
132             * 
133             * @see sale.Shop#quit()
134             */
135            public void quit() {
136                    if (shutdown(false)) {
137                            System.exit(0);
138                    }
139            }
140            /**
141             * Helper method to avoid to long code-lines.
142             * 
143             * @return the global <code>Catalog</code> of videos.
144             */
145            public static CatalogImpl getVideoCatalog() {
146                    return (CatalogImpl) Shop.getTheShop().getCatalog(C_VIDEOS);
147            }
148            /**
149             * Helper method to avoid to long code-lines.
150             * 
151             * @return the global <code>Stock</code> of videos
152             */
153            public static CountingStockImpl getVideoStock() {
154                    return (CountingStockImpl) Shop.getTheShop().getStock(CC_VIDEOS);
155            }
156    
157            /**
158             * Helper method to avoid to long code-lines.
159             * 
160             * @return the global <code>MoneyBag</code> containing the money of the shop.
161             */
162            public static MoneyBagImpl getMoneyBag() {
163                    return (MoneyBagImpl) Shop.getTheShop().getStock(MB_MONEY);
164            }
165            /**
166             * Helper method to avoid to long code-lines.
167             * 
168             * @return the global <code>EUROCurrencyImpl</code> -instance
169             */
170            public static EUROCurrencyImpl getCurrency() {
171                    return (EUROCurrencyImpl) Shop.getTheShop().getCatalog(C_CURRENCY);
172            }
173    
174            /**
175             * Method to iterate over all rented videos and taking out those, which renting costs exceed
176             * the purchase price
177             *  
178             */
179            public static void checkRentedVideos() {
180                    Iterator it_users = UserManager.getGlobalUM().getUsers().iterator();
181                    while (it_users.hasNext()) {
182                            AutomatUser c = (AutomatUser) it_users.next();
183                            Iterator it_stock = c.getVideoStock().iterator(null, false);
184                            while (it_stock.hasNext()) {
185                                    VideoCassette vc = (VideoCassette) it_stock.next();
186                                    Value v =
187                                            ((QuoteValue) vc.getAssociatedItem(null).getValue())
188                                                    .getOffer();
189                                    if (vc.getCost().compareTo(v) >= 0) {
190                                            try {
191                                                    c.getVideoStock().remove(vc, null);
192                                            } catch (VetoException e) {
193                                                    e.printStackTrace();
194                                            }
195                                    }
196                            }
197                    }
198            }
199    }